package com.waikuai.shop.mapper;

import com.waikuai.shop.vo.CategoryDistributionVO;
import com.waikuai.shop.vo.OrderTrendVO;
import com.waikuai.shop.vo.SalesRankingVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 统计Mapper接口
 * @author waikuai
 */
@Mapper
public interface StatisticsMapper {

    /**
     * 统计时间范围内的订单总数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单总数
     */
    Long countOrders(@Param("startTime") LocalDateTime startTime,
                     @Param("endTime") LocalDateTime endTime);

    /**
     * 统计时间范围内已支付订单的销售总额
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 销售总额
     */
    BigDecimal sumSalesAmount(@Param("startTime") LocalDateTime startTime,
                              @Param("endTime") LocalDateTime endTime);

    /**
     * 统计时间范围内的新增用户数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 新增用户数
     */
    Long countNewUsers(@Param("startTime") LocalDateTime startTime,
                       @Param("endTime") LocalDateTime endTime);

    /**
     * 统计额度卡总数
     * @return 额度卡总数
     */
    Long countTotalCards();

    /**
     * 统计已兑换额度卡数
     * @return 已兑换数
     */
    Long countExchangedCards();

    /**
     * 查询订单趋势数据（按天分组）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单趋势列表
     */
    List<OrderTrendVO> selectOrderTrendByDay(@Param("startTime") LocalDateTime startTime,
                                             @Param("endTime") LocalDateTime endTime);

    /**
     * 查询订单趋势数据（按小时分组）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单趋势列表
     */
    List<OrderTrendVO> selectOrderTrendByHour(@Param("startTime") LocalDateTime startTime,
                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 查询分类销售分布
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分类分布列表
     */
    List<CategoryDistributionVO> selectCategoryDistribution(@Param("startTime") LocalDateTime startTime,
                                                            @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商品销售排行
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 查询数量限制
     * @return 商品销售排行列表
     */
    List<SalesRankingVO> selectTopProducts(@Param("startTime") LocalDateTime startTime,
                                          @Param("endTime") LocalDateTime endTime,
                                          @Param("limit") Integer limit);

    /**
     * 查询新增用户趋势（按天分组）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用户趋势列表
     */
    List<OrderTrendVO> selectUserGrowthByDay(@Param("startTime") LocalDateTime startTime,
                                             @Param("endTime") LocalDateTime endTime);
}

